package main

import "fmt"

// 接口是一个规范
type Usber interface {
	Start()
	Stop()
}

type Camera struct { 
}

// 如果接口里面有方法的话，必须要通过结构体或者自定义类型来实现这个接口
type Phone struct {
	Name string
}
// 手机要实现usb接口的话必须得实现usb接口中的所有方法
func (p Phone) Start() {
	fmt.Println(p.Name, "开始工作")
}
func (p Phone) Stop() {
	fmt.Println(p.Name, "停止工作")
}

func (p Camera) Start() {
	fmt.Println("启动")
}
func (p Camera) Stop() {
	fmt.Println("关机")
}
func (p Camera) run() {
	fmt.Println("运行")
}

type Computer struct {
}

func (c Computer) work(usb Usber) {
	if _, ok := usb.(Camera); ok {
		fmt.Println("相机开始工作")
	} else if _, ok := usb.(Phone); ok {
		fmt.Println("手机开始工作")
	}
	usb.Start()
	usb.Stop()
}

func main() {
	p := Phone{
		Name: "小米手机",
	}
	p.Start()
	p.Stop()

	var p1 Usber  // golang中接口就是一个数据类型

	p1 = p  // 表示手机实现usb接口
	p1.Start()
	p1.Stop()

	c := Camera{}

	var c1 Usber = c  // 表示相机实现usb接口
	c1.Start()
	c1.Stop()
	c.run()

	var computer = Computer{}
	var phone = Phone{
		Name: "华为手机",
	}
	var camera = Camera{}

	computer.work(phone)
	computer.work(camera)
}